// 导入axios请求
// 导入的axios是全局的axios
import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Toast } from 'vant'
import JSONBig from 'json-bigint'

const request = axios.create({
  // 基准地址
  // baseURL: 'http://ttapi.research.itcast.cn/app/',
  // baseURL: 'http://toutiao-app.itheima.net/',
  // baseURL: '/myapi',
  baseURL: process.env.VUE_APP_URL,
  // 超时: 如果接口超过3000毫秒,直接失败
  // timeout: 3000
  transformResponse: [
    function (data) {
      try {
        return JSONBig.parse(data)
      } catch {
        return data
      }
    }
  ]
})

// 配置请求拦截器
request.interceptors.request.use(
  function (config) {
    // 获取token,配置token
    const tokenInfo = store.state.user.tokenInfo
    // console.log(tokenInfo)
    if (tokenInfo.token) {
      config.headers.Authorization = 'Bearer ' + tokenInfo.token
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  })

// 添加响应拦截器
request.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response
  },
  async function (error) {
    // 对响应错误做点什么
    if (error.response.status === 401) {
      const tokenInfo = store.state.user.tokenInfo
      if (!tokenInfo.refresh_token) {
        // 没有刷新token
        // 清除token
        store.commit('user/removeToken')
        // 跳转到登陆
        router.push({
          path: '/login',
          query: {
            back: router.currentRoute.fullPath
          }
        })
        // 提醒
        Toast.fail('登录信息过期,请重新登录')
        return
      }
      // 有刷新token
      try {
        const res = await axios({
          method: 'put',
          url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
          headers: {
            Authorization: 'Bearer ' + tokenInfo.refresh_token
          }
        })
        // 把新token存储到本地
        store.commit('user/setToken', {
          token: res.data.data.token,
          refresh_token: tokenInfo.refresh_token
        })
        // 重新发送请求
        return request(error.config)
      } catch (err) {
        store.commit('user/removeToken')
        // 跳转到登陆
        router.push({
          path: '/login',
          query: {
            back: router.currentRoute.fullPath
          }
        })
        // 提醒
        Toast.fail('登录信息过期,请重新登录')
      }
    } else {
      return Promise.reject(error)
    }
  })

export default request
